J-Pocket

J-Pocket è una semplice applicazione desktop multi utente per la gestione di un portafoglio virtuale, dove è possibile tenere traccia di tutte le proprie transazioni. L'applicazione tiene traccia di tutte le transazioni in entrata e in uscita, permettendo di visualizzare i totali di entrambi i tipi di transazioni, e di visualizzare il totale del portafoglio.

Funzionalità

La prima interfaccia che si presenta all'utente è quella di login, dove è possibile inserire le proprie credenziali per accedere all'applicazione. Se l'utente non è registrato, può cliccare sul pulsante "signup" per creare un nuovo account.

Una volta effettuato il login, l'utente viene reindirizzato alla pagina principale dell'applicazione, dove è possibile visualizzare il totale del portafoglio, il totale delle transazioni in entrata e il totale delle transazioni in uscita. Inoltre, è possibile visualizzare una tabella con tutte le transazioni effettuate dall'utente, le righe della tabella possono essere riordinate cliccando sulle intestazioni delle colonne.
Per eliminare una transazione è sufficiente selezionare la riga corrispondente, premenre il tasto destro del mouse e selezionare "Remove".
Per aggiungere una nuova transazione è sufficiente cliccare sul pulsante rotondo in basso con il simbolo '+' e compilare il form che si apre.


Decrizione tecnica

L'applicazione è stata sviluppata in Java e utilizza il database MySQL per la memorizzazione dei dati. Il server è stato sviluppato utilizzando il framework Spring Boot, mentre il client è stato sviluppato utilizzando il framework JavaFX.

Il server espone una REST API che consente di effettuare le operazioni CRUD sul database.
Il client si connette al server tramite una connessione TCP, e invia le richieste al server tramite il protocollo HTTP.

Endpoint

Gli endpoint esposti dal server sono:

POST /api/auth/signup

Questo endpoint consente di registrare un nuovo utente.
Il body della richiesta deve contenere un oggetto JSON con le seguenti proprietà:

{
    "username": "username",
    "password": "password"
}

Le possibili risposte restituite dal server sono:

{
    "id": "uuid"
}
Username già esistente
%%{init: { "sequence": { "mirrorActors":false }}}%% sequenceDiagram participant Client participant Server Client->>Server: POST /api/auth/signup alt 200 OK Server->>Client: UUID utente else 409 CONFLICT Server->>Client: "Username già esistente" end
POST /api/auth/login

Questo endpoint consente di effettuare il login.
Il body della richiesta deve contenere un oggetto JSON con le seguenti proprietà:

{
    "username": "username",
    "password": "password"
}

Le possibili risposte restituite dal server sono:

{
    "id": "uuid"
}
Username o password errati
%%{init: { "sequence": { "mirrorActors":false }}}%% sequenceDiagram participant Client participant Server Client->>Server: POST /api/auth/login alt 200 OK Server->>Client: UUID utente else 401 UNAUTHORIZED Server->>Client: "Username o password errati" end
GET /api/user/{uuid}

Nota: Questo endpoint non viene utilizzato dal client, ma è stato creato per possibili implementazioni future.

Questo endpoint consente di ottenere le informazioni dell'utente e le sue transazioni effettuate.
L'ID dell'utente deve essere passato come parametro nell'URL.
Le possibili risposte restituite dal server sono:

{
    "id": "c4ba5f96-c518-4915-801d-34e9a335be8d",
    "username": "user",
    "password": "pass",
    "transactions": [
        {"id": 1},
        {"id": 2}
    ]
}
Utente non trovato
%%{init: { "sequence": { "mirrorActors":false }}}%% sequenceDiagram participant Client participant Server Client->>Server: GET /api/user/{uuid} alt 200 OK Server->>Client: Informazioni utente else 404 NOT FOUND Server->>Client: "Utente non trovato" end
GET /api/user/{uuid}/transaction

Questo endpoint consente di ottenere tutte le transazioni effettuate dall'utente.
L'ID dell'utente deve essere passato come parametro nell'URL.
Le possibili risposte restituite dal server sono:

[
    {
        "id": 1,
        "title": "Stipendio",
        "amount": 1000.0,
        "date": "2020-12-01T00:00:00.000+00:00",
        "type": 0
    },
    {
        "id": 2,
        "title": "Pizza",
        "amount": 6.5,
        "date": "2020-15-01T00:00:00.000+00:00",
        "type": 1
    }
]
Utente non trovato
%%{init: { "sequence": { "mirrorActors":false }}}%% sequenceDiagram participant Client participant Server Client->>Server: GET /api/user/{uuid}/transaction alt 200 OK Server->>Client: Transazioni utente else 404 NOT FOUND Server->>Client: "Utente non trovato" end
POST /api/user/{uuid}/transaction

Questo endpoint consente di creare una nuova transazione per l'utente.
L'ID dell'utente deve essere passato come parametro nell'URL.
Il body della richiesta deve contenere un oggetto JSON con le seguenti proprietà:

{
	"title": "Stipendio",
	"amount": 1000.0,
	"date": "2020-12-01T00:00:00.000+00:00",
	"type": 0
}

Le possibili risposte restituite dal server sono:

{
	"id": 1,
	"title": "Stipendio",
	"amount": 1000.0,
	"date": "2020-12-01T00:00:00.000+00:00",
	"type": 0
}
Utente non trovato
%%{init: { "sequence": { "mirrorActors":false }}}%% sequenceDiagram participant Client participant Server Client->>Server: POST /api/user/{uuid}/transaction alt 201 CREATED Server->>Client: Informazioni transazione else 404 NOT FOUND Server->>Client: "Utente non trovato" end
GET /api/user/{uuid}/transaction/{id}

Nota: Questo endpoint non viene utilizzato dal client, ma è stato creato per possibili implementazioni future.

Questo endpoint consente di ottenere le informazioni di una transazione effettuata dall'utente.
L'ID dell'utente deve essere passato come parametro nell'URL.
L'ID della transazione deve essere passato come parametro nell'URL.
Le possibili risposte restituite dal server sono:

{
	"id": 1,
	"title": "Stipendio",
	"amount": 1000.0,
	"date": "2020-12-01T00:00:00.000+00:00",
	"type": 0
}
Utente non trovato
Transazione non trovata
%%{init: { "sequence": { "mirrorActors":false }}}%% sequenceDiagram participant Client participant Server Client->>Server: GET /api/user/{uuid}/transaction/{id} alt 200 OK Server->>Client: Informazioni transazione else 404 NOT FOUND Server->>Client: "Utente non trovato" else 404 NOT FOUND Server->>Client: "Transazione non trovata" end
DELETE /api/user/{uuid}/transaction/{id}

Questo endpoint consente di eliminare una transazione effettuata dall'utente.
L'ID dell'utente deve essere passato come parametro nell'URL.
L'ID della transazione deve essere passato come parametro nell'URL.
Le possibili risposte restituite dal server sono:

Utente non trovato
Transazione non trovata
%%{init: { "sequence": { "mirrorActors":false }}}%% sequenceDiagram participant Client participant Server Client->>Server: DELETE /api/user/{uuid}/transaction/{id} alt 204 NO CONTENT Server->>Client: else 404 NOT FOUND Server->>Client: "Utente non trovato" else 404 NOT FOUND Server->>Client: "Transazione non trovata" end



Dettagli Tecnici

Il progetto è diviso in due cartelle principali:

Il Server si collega al database tramite un file di configurazione che si trova nella cartella server e si chiama application.properties.
La porta di connessione al database è impostata a 3306.
Il nome del database è 615682, l'utente è root e la password è root.
Se il database non esiste, viene creato automaticamente.
All'avvio del server, vengono create le seguenti tabelle:

Vengono anche dei dati di esempio:

Sono presenti anche 2 test di unità per il server, che si trovano nella cartella /server/src/test/java/it/unipi/jpocket/server/AuthControllerTests.java.
I test verificano che la struttura e le risposte del server per i seguenti endpoint siano corrette:

Per eseguire i test, è necessario eseguire il comando mvn test nella cartella /server.